﻿/*
 * 作者：新生命开发团队（http://www.newlifex.com/）
 * 
 * 版权：版权所有 (C) 新生命开发团队 2002-2014
*/

using System;
using System.IO;
using System.Xml.Serialization;
using CuteAnt.Serialization;

namespace CuteAnt.Messaging
{
	/// <summary>指定长度的字节数据消息</summary>
	/// <remarks>
	/// 一般用于对数据进行二次包装，理论上，这是一个万能消息。
	/// 数据长度由<see cref="Data"/>决定，以编码整数来存储。
	/// </remarks>
	public class DataMessage : Message
	{
		/// <summary>消息类型</summary>
		[XmlIgnore]
		public override MessageKind Kind { get { return MessageKind.Data; } }

		//private Int32 _Length;
		///// <summary>长度</summary>
		//public Int32 Length { get { return _Length; } set { _Length = value; } }

		private Byte[] _Data;

		/// <summary>数据</summary>
		public Byte[] Data { get { return _Data; } set { _Data = value; } }

		/// <summary>已重载。</summary>
		/// <param name="stream">数据流</param>
		/// <param name="rwkind">序列化类型</param>
		protected override void OnWrite(Stream stream, RWKinds rwkind)
		{
			// 因为不写对象引用，所以不能为null
			if (Data == null) Data = new Byte[0];

			base.OnWrite(stream, rwkind);
		}

		/// <summary>读写前设置。不使用对象引用</summary>
		/// <param name="rw"></param>
		protected override void OnReadWriteSet(IReaderWriter rw)
		{
			base.OnReadWriteSet(rw);

			rw.Settings.UseObjRef = false;
		}

		#region 辅助

		/// <summary>已重载。</summary>
		/// <returns></returns>
		public override string ToString()
		{
			var data = Data;
			return String.Format("{0} Length={1}", base.ToString(), data != null ? data.Length : 0);
		}

		#endregion
	}
}